{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# nio [JDK10都发布了，nio你了解多少？](https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484235&idx=1&sn=4c3b6d13335245d4de1864672ea96256&chksm=ebd7424adca0cb5cb26eb51bca6542ab816388cf245d071b74891dd3f598ccd825f8611ca20c&scene=21###wechat_redirect)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## buffer代码演示\n",
    "首先展示一下是如何创建缓冲区的，核心变量的值是怎么变化的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-26T18:42+0000",
     "start_time": "2020-08-26T18:42:05.505Z"
    }
   },
   "outputs": [],
   "source": [
    "import java.nio.ByteBuffer;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-26T19:04+0000",
     "start_time": "2020-08-26T19:04:57.159Z"
    }
   },
   "outputs": [],
   "source": [
    "public static void main() {\n",
    "\n",
    "    // 创建一个缓冲区\n",
    "    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);\n",
    "\n",
    "    // 看一下初始时4个核心变量的值\n",
    "    System.out.println(\"初始时-->limit--->\"+byteBuffer.limit());\n",
    "    System.out.println(\"初始时-->position--->\"+byteBuffer.position());\n",
    "    System.out.println(\"初始时-->capacity--->\"+byteBuffer.capacity());\n",
    "    System.out.println(\"初始时-->mark--->\" + byteBuffer.mark());\n",
    "\n",
    "    System.out.println(\"--------------------------------------\");\n",
    "\n",
    "    // 添加一些数据到缓冲区中\n",
    "    String s = \"anlzou\";\n",
    "    byteBuffer.put(s.getBytes());\n",
    "\n",
    "    // 看一下初始时4个核心变量的值\n",
    "    System.out.println(\"put完之后-->limit--->\"+byteBuffer.limit());\n",
    "    System.out.println(\"put完之后-->position--->\"+byteBuffer.position());\n",
    "    System.out.println(\"put完之后-->capacity--->\"+byteBuffer.capacity());\n",
    "    System.out.println(\"put完之后-->mark--->\" + byteBuffer.mark());\n",
    "    \n",
    "    System.out.println(\"--------------------------------------\");\n",
    "    // 切换成读模式\n",
    "    byteBuffer.flip();\n",
    "    // 看一下初始时4个核心变量的值\n",
    "    System.out.println(\"flip完之后-->limit--->\"+byteBuffer.limit());\n",
    "    System.out.println(\"flip完之后-->position--->\"+byteBuffer.position());\n",
    "    System.out.println(\"flip完之后-->capacity--->\"+byteBuffer.capacity());\n",
    "    System.out.println(\"flip完之后-->mark--->\" + byteBuffer.mark());\n",
    "    \n",
    "    System.out.println(\"--------------------------------------\");\n",
    "     // 创建一个limit()大小的字节数组(因为就只有limit这么多个数据可读)\n",
    "    byte[] bytes = new byte[byteBuffer.limit()];\n",
    "\n",
    "    // 将读取的数据装进我们的字节数组中\n",
    "    byteBuffer.get(bytes);\n",
    "\n",
    "    // 输出数据\n",
    "    System.out.println(new String(bytes, 0, bytes.length));\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-26T19:05+0000",
     "start_time": "2020-08-26T19:04:59.223Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初始时-->limit--->1024\n",
      "初始时-->position--->0\n",
      "初始时-->capacity--->1024\n",
      "初始时-->mark--->java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024]\n",
      "--------------------------------------\n",
      "put完之后-->limit--->1024\n",
      "put完之后-->position--->6\n",
      "put完之后-->capacity--->1024\n",
      "put完之后-->mark--->java.nio.HeapByteBuffer[pos=6 lim=1024 cap=1024]\n",
      "--------------------------------------\n",
      "flip完之后-->limit--->6\n",
      "flip完之后-->position--->0\n",
      "flip完之后-->capacity--->1024\n",
      "flip完之后-->mark--->java.nio.HeapByteBuffer[pos=0 lim=6 cap=1024]\n",
      "--------------------------------------\n",
      "anlzou\n"
     ]
    }
   ],
   "source": [
    "main();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我想要从缓存区拿数据，怎么拿呀？？NIO给了我们一个`flip()`方法。这个方法可以改动position和limit的位置！\n",
    "\n",
    "还是上面的代码，我们`flip()`一下后，再看看4个核心属性的值发生了变化：\n",
    "\n",
    "很明显的是：\n",
    "\n",
    "- limit变成了position的位置了\n",
    "- 而position变成了0\n",
    "\n",
    "看到这里的同学可能就会想到了：当调用完`filp()`时：limit是限制读到哪里，而position是从哪里读\n",
    "\n",
    "一般我们称`filp(`)为“切换成读模式”\n",
    "- 每当要从缓存区的时候读取数据时，就调用`filp()`“切换成读模式”。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-26T19:12+0000",
     "start_time": "2020-08-26T19:12:26.292Z"
    }
   },
   "outputs": [],
   "source": [
    "public static void test(){\n",
    "    // 创建一个缓冲区\n",
    "    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);\n",
    "\n",
    "    // 添加一些数据到缓冲区中\n",
    "    String s = \"anlzou\";\n",
    "    byteBuffer.put(s.getBytes());\n",
    "    \n",
    "    \n",
    "    /**\n",
    "    * 切换成读模式\n",
    "    * 使用该模式才能从缓冲区中读取数据\n",
    "    */\n",
    "    byteBuffer.flip();\n",
    "\n",
    "    // 创建一个limit()大小的字节数组(因为就只有limit这么多个数据可读)\n",
    "    byte[] bytes = new byte[byteBuffer.limit()];\n",
    "\n",
    "    // 将读取的数据装进我们的字节数组中\n",
    "    byteBuffer.get(bytes);\n",
    "\n",
    "    // 输出数据\n",
    "    System.out.println(new String(bytes, 0, bytes.length));\n",
    "    \n",
    "    \n",
    "    /*-----------------清空缓冲区实验----------------*/\n",
    "    // 清空缓冲区\n",
    "    byteBuffer.clear();\n",
    "    \n",
    "    byte[] bytes_ = new byte[byteBuffer.limit()];\n",
    "    \n",
    "    // 将读取的数据装进我们的字节数组中\n",
    "    byteBuffer.get(bytes_);\n",
    "    \n",
    "    // 输出数据\n",
    "    System.out.println(new String(bytes_, 0, bytes_.length));\n",
    "    \n",
    "    System.out.println(\"--------------------------------------\");\n",
    "    // 看一下初始时4个核心变量的值\n",
    "    System.out.println(\"clear完之后-->limit--->\"+byteBuffer.limit());\n",
    "    System.out.println(\"clear完之后-->position--->\"+byteBuffer.position());\n",
    "    System.out.println(\"clear完之后-->capacity--->\"+byteBuffer.capacity());\n",
    "    System.out.println(\"clear完之后-->mark--->\" + byteBuffer.mark());\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-26T19:12+0000",
     "start_time": "2020-08-26T19:12:28.286Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "anlzou\n",
      "anlzou\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n",
      "--------------------------------------\n",
      "clear完之后-->limit--->1024\n",
      "clear完之后-->position--->1024\n",
      "clear完之后-->capacity--->1024\n",
      "clear完之后-->mark--->java.nio.HeapByteBuffer[pos=1024 lim=1024 cap=1024]\n"
     ]
    }
   ],
   "source": [
    "test();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "读完我们还想写数据到缓冲区，那就使用`clear()`函数，这个函数会“清空”缓冲区：\n",
    "\n",
    "- **数据没有真正被清空**，只是被**遗忘**掉了"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Java",
   "language": "java",
   "name": "java"
  },
  "language_info": {
   "codemirror_mode": "java",
   "file_extension": ".jshell",
   "mimetype": "text/x-java-source",
   "name": "Java",
   "pygments_lexer": "java",
   "version": "11.0.8+10-post-Ubuntu-0ubuntu120.04"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
